home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / smaltalk / manchest.lha / MANCHESTER / manchester / 2.2 / Future.st < prev    next >
Text File  |  1993-07-24  |  3KB  |  116 lines

  1. "    NAME        Future
  2.     AUTHOR        miw@cs.man.ac.uk
  3.     FUNCTION An implementation of the "future" control construct
  4.     ST-VERSIONS    2.2
  5.     PREREQUISITES     
  6.     CONFLICTS    
  7.     DISTRIBUTION      world
  8.     VERSION        1.1
  9.     DATE    22 Jan 1989
  10. SUMMARY    Future
  11.     is an implementation of the MultiLisp 'future' control
  12.    structure.   This is a bare-bones version and is superceded by 
  13.    Parallelism.st
  14.    (2.2). MIW
  15. "!
  16. 'From Smalltalk-80, version 2, of April 1, 1983 on 18 February 1987 at 4:46:06 pm'!
  17.  
  18. Object subclass: #Future
  19.     instanceVariableNames: 'result semaphore '
  20.     classVariableNames: ''
  21.     poolDictionaries: ''
  22.     category: 'Kernel-Processes'!
  23. Future comment:
  24. 'I represent an execution in progress.  Any messages sent to me are delayed until execution has completed.'!
  25.  
  26.  
  27. !Future methodsFor: 'synchronising'!
  28.  
  29.  
  30. doesNotUnderstand: aMessage
  31.     semaphore wait.
  32.     semaphore signal.    "Wake up anything else that might be waiting"
  33.     ^result perform: aMessage selector withArguments: aMessage arguments! !
  34.  
  35. !Future methodsFor: 'evaluating'!
  36.  
  37.  
  38. block: aBlock
  39.     "Execute aBlock in parallel with whatever called me, but ensure that any messages sent to me before execution of the block has terminated are suspended until it has terminated."
  40.     semaphore _ Semaphore new.
  41.     [result _ aBlock value.  semaphore signal] fork!
  42.  
  43.  
  44.  
  45. block: aBlock value: aValue
  46.     semaphore _ Semaphore new.
  47.     [result _ aBlock value: aValue.  semaphore signal] fork!
  48.  
  49.  
  50.  
  51. block: aBlock value: value1 value: value2
  52.     semaphore _ Semaphore new.
  53.     [result _ aBlock value: value1 value: value2.
  54.      semaphore signal] fork!
  55.  
  56.  
  57.  
  58. block: aBlock value: value1 value: value2 value: value3
  59.     semaphore _ Semaphore new.
  60.     [result _ aBlock value: value1 value: value2 value: value3.
  61.      semaphore signal] fork!
  62.  
  63.  
  64.  
  65. block: aBlock valueWithArguments: anArray
  66.     semaphore _ Semaphore new.
  67.     [result _ aBlock valueWithArguments: anArray.
  68.      semaphore signal] fork! !
  69. "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
  70.  
  71. Future class
  72.     instanceVariableNames: ''!
  73.  
  74.  
  75. !Future class methodsFor: 'examples'!
  76.  
  77.  
  78. example
  79.     | fac |
  80.     fac _ [100 factorial] futureValue.
  81.     Transcript show: 'evaluating factorial...'.
  82.     Transcript show: fac printString
  83.     "Future example"! !
  84.  
  85. !Future class methodsFor: 'class initialization'!
  86.  
  87.  
  88. initialize
  89.     superclass _ nil     "must avoid the checks"
  90.  
  91.     "Future initialize"! !
  92.  
  93. Future initialize!
  94.  
  95. !BlockContext methodsFor: 'parallel evaluation'!
  96.  
  97. futureValue
  98.     "Fork a synchronised evaluation of myself"
  99.     ^Future new block: self!
  100.  
  101. futureValue: aValue
  102.     "Fork a synchronised evaluation of myself"
  103.     ^Future new block: self value: aValue!
  104.  
  105. futureValue: value1 value: value2
  106.     "Fork a synchronised evaluation of myself"
  107.     ^Future new block: self value: value1 value: value2!
  108.  
  109. futureValue: value1 value: value2 value: value3
  110.     "Fork a synchronised evaluation of myself"
  111.     ^Future new block: self value: value1 value: value2 value: value3!
  112.  
  113. futureValueWithArguments: anArray
  114.     "Fork a synchronised evaluation of myself"
  115.      ^Future new block: self valueWithArguments: anArray! !
  116.